/**
 * Copyright (2017, ) Institute of Software, Chinese Academy of Sciences
 * Copyright (2017, ) Bocloud Co,. Lmt
 */
package cn.abcsys.devops.core.application.configs;

import java.util.HashMap;
import java.util.Map;

/**
 * @author wuheng@{otcaix.iscsa.ac.cn,beyondcent.com}
 * @date   May 20, 2017
 *
 */
public class ResourceInfo {
	
	/**
	 * 所使用CPU个数，物理环境下可使用cgroup进行限制
	 * 格式0-1，说明使用CPU的0和1
	 * 如果取null，则说明CPU不做约束，或大于物理资源上限
	 */
	private String cpuSet;
	
	/**
	 * 内存大小，单位是MB，物理环境下可使用cgroup进行限制
	 * 如果取0，则说明内存不做约束，取值不可小于0，或大于物理资源上限
	 */
	private int memSize;
	
	
	/**
	 * 应用所在网络
	 */
	private String network;
	
	/**
	 * 环境变量，环境key和value
	 */
	private Map<String, String> envs = new HashMap<String, String>();
	
	/**
	 * 硬盘卷，卷名和路径
	 */
	private Map<String, String> volumes = new HashMap<String, String>();
	

	/**
	 * 返回CPU个数
	 * 
	 * @return
	 */
	public String getCpuSet() {
		return cpuSet;
	}

	/**
	 * 设置CPU个数
	 * 如果取0，则说明CPU不做约束，取值不可小于0，或大于物理资源上限
	 * 物理环境下，使用cgroup进行限制，容器环境下设置容器
	 * @param cpuNum
	 */
	public void setCpuSets(String cpuSet) {
		this.cpuSet = cpuSet;
	}

	/**
	 * 返回内存大小，单位是MB
	 */
	public int getMemSize() {
		return memSize;
	}

	/**
	 * 设置内存大小，单位是MB
	 * 如果取0，则说明内存不做约束，取值不可小于1024，或大于物理资源上限
	 * 物理环境下，使用cgroup进行限制，容器环境下设置容器
	 * @return
	 */
	public void setMemSize(int memSize) {
		this.memSize = memSize;
	}

	/**
	 * 返回网络
	 * 
	 * @return
	 */
	public String getNetwork() {
		return network;
	}

	/**
	 * 设置网络，最长长度不超过16
	 * 
	 * @param network
	 */
	public void setNetwork(String network) {
		this.network = network;
	}

	
	/**
	 * 获取变量信息
	 * 
	 * @return
	 */
	public Map<String, String> getEnvs() {
		return envs;
	}

	/**
	 * 添加环境变量，若存在，则覆盖
	 * 
	 * @param key
	 * @param value
	 */
	public void addEnvs(String key, String value) {
		this.envs.put(key, value);
	}

	/**
	 * 返回所有卷
	 * 
	 * @return
	 */
	public Map<String, String> getVolumes() {
		return volumes;
	}

	/**
	 * 添加卷，如果name重名，则覆盖
	 * 注意：容器环境下存在容器里路径，挂载到主机的操作
	 * 本方法只是给路径别名，比如name为UUID,这里的路径在容器环境下是只容器里的路径
	 * 采用规则/opt/bocloud自动关联到物理机环境
	 * 
	 * @param name
	 * @param path
	 */
	public void addVolumes(String name, String path) {
		this.volumes.put(name, path);
	}

}
